#include<signal.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>


void hanlder(int sig)
{
  wait(NULL);
}
//非阻塞和非轮询，通过信号释放子进程
int main()
{
  pid_t id=fork();
  if(id<0)
  {
    perror("fork");
    return 1;
  }
  else if(id==0)
  {
    //child
    printf("I am child pid:%d\n",getpid());
    sleep(2);
    return 0;
  }
  else{
    //father
    printf("I am father pid:%d\n",getpid());
    signal(SIGCHLD,hanlder);
    //do my thing
    printf("do father thing\n");
    sleep(10);
    while(1){;}
    printf("father will exit\n");
  }
  return 0;
}




//void show(int signo)
//{
//  int i=0;
//  while(i<10)
//  {
//    printf("get a signo: %d\n",signo);
//    i++;
//    sleep(1);
//  }
//}
//void hanlder(int sig)
//{
//  show(sig);
//}
////可重入函数以及sigaction
//int main()
//{
//  struct sigaction act,oact;
//  
//  act.sa_handler=hanlder;
//  sigemptyset(&act.sa_mask);
//  sigaddset(&act.sa_mask,3);
//  sigaddset(&act.sa_mask,4);
//  act.sa_flags=0;
//  //act.sa_restorer=NULL;
//  //act.sa_sigaction=NULL;
//  
//  //捕捉信号以及设置屏蔽字
//  sigaction(2,&act,&oact);
//  show(999);
//  return 0;
//}
//
//
//void Showsig(const sigset_t* set)
//{
//  int i=1;
//  for(;i<=31;i++)
//  {
//    if(sigismember(set,i)==1)
//    {
//      printf("1");
//    }
//    else{
//      printf("0");
//    }
//  }
//  printf("\n");
//}
//void hanlder(int sig)
//{
//  sigset_t in,out;
//  sigemptyset(&in);
//  sigemptyset(&out);
//
//  //获取peinding信号集
//  sigset_t pd;
//  sigemptyset(&pd);
//  sigpending(&pd);
//  printf("进入信号处理的pending集\n");
//  Showsig(&pd);
//
//  //照理说，执行处理信号动作时，内核会自动在该信号添加屏蔽
//  //获取，但不发信号
//  sigprocmask(SIG_SETMASK,&in,&out);
//
//  //展示信号屏蔽字
//  printf("信号屏蔽子集\n");
//  Showsig(&out);  
//  sleep(2);
//  //恢复
//  sigprocmask(SIG_SETMASK,&out,&in);
//
//  printf("请立马输入信号\n");
//  sleep(5);
//
//  //看再一次输入的是否会存入pending集中
//  sigpending(&pd);
//  printf("信号处理时，信号再次进入的pending集\n");
//  Showsig(&pd);
//}
////验证内核态处理信号时自动屏蔽信号集，以及信号在抵达时，信号再次未决会如何
//int main()
//{
//  signal(2,hanlder);
//  printf("信号捕捉成功\n");
//  while(1){;}
//  return 0;
//  //结论，在进行信号处理时，内核会自动屏蔽该信号，期间有相同信号进入是
//  //pending集存储其中，（也直接证明只多存储一个信号），信号处理完成后
//  //内核不在屏蔽该信号，pending集中存储的信号再次抵达.
//}
//


//void Show_Pending(const sigset_t *set)
//{
//  int i=1;
//  for(;i<=31;i++)
//  {
//    if(sigismember(set,i)==1)
//    {
//      printf("1");
//    }
//    else{
//      printf("0");
//    }
//  }
//  printf("\n");
//  sleep(1);
//}
//void handler(int sig)
//{
//  printf("cath the sigal:%d\n",sig);
//}
////设置信号屏蔽字，展示pending集
//int main()
//{
//  //信号捕捉
//  signal(2,handler);
//  //设置信号屏蔽字
//  sigset_t in,out;
//  sigemptyset(&in);
//  sigemptyset(&out);
//
//  sigaddset(&in,2);
//
//  sigprocmask(SIG_SETMASK,&in,&out);
//
//  printf("信号屏蔽字设置成功，请发送信号");
//  fflush(stdout);
//  sleep(3);
//
//  //读取未决信号集
//  sigset_t pd;
//  sigemptyset(&pd);
//  sigpending(&pd);
//
//  //从用户层面显示未决信号集
//  Show_Pending(&pd);
//
//  //恢复信号屏蔽字
//  sigprocmask(SIG_SETMASK,&out,&in);    //恢复后处理未决信号
//  printf("信号屏蔽已取消\n");
//  //重新获取pending信号集
//  sigpending(&pd);
//  Show_Pending(&pd);
//
//  return 0;
//}






//void handler(int sig)
//{
//  printf("catch the signal:%d\n",sig);
//}
////设置，读取信号屏蔽字
//int main()
//{
//  //设置捕捉信号
//  signal(2,handler);
//
//  sigset_t in,out;
//  //初始化
//  sigemptyset(&in);
//  sigemptyset(&out);
//
//  //把2信号设置阻塞
//  sigaddset(&in,2);
//
//  //从用户态到系统
//  sigprocmask(SIG_SETMASK,&in,&out);
//
//  int count=0;
//  for(count=0;count<=5;count++)
//  {
//    sleep(1);
//  }
//
//  //恢复信号屏蔽字
//  sigprocmask(SIG_SETMASK,&out,&in);
//  printf("promask to start\n");
//  for(;count>0;count--)
//  {
//    sleep(1);
//  }
//  return 0;
//}
//
//
//
//





//void handler(int sig)
//{
//  printf("catch a signal: %d\n",sig);
//}
//
////初步尝试信号捕捉
//int main()
//{ 
//  signal(2,handler);
//  while(1)
//  {
//    ;
//  }
//  return 0;
//}
